with Ada.Text_IO;
with Cellules;			use Cellules;
with Joueurs;			use Joueurs;
with Plateaux;			use Plateaux;
with Gdk; 			use Gdk;
with Gdk.Color; 		use Gdk.Color;

package Partie is

   Type T_Game Is Private;
   SubType IA_Difficulty is Character range '1'..'3';
   Joueur1 : Constant Positive := 1;
   Joueur2 : Constant Positive := 2;

   Procedure Saisir_Coup(Un_Plateau: in out Plateaux.Plateau; X: out Plateaux.Colonne; Y: out Plateaux.Ligne);
   Procedure Jouer_Coup(Un_Plateau : in out Plateaux.Plateau; Un_Symbole: in out Cellules.Symbole; Fini: out Boolean);
   Procedure Jouer_Coup_IA(Un_Plateau : in out Plateaux.Plateau;
                           Un_Symbole: in out Cellules.Symbole;Level: in IA_Difficulty ; Fini: out Boolean);
   Procedure Jouer_Partie(J1: in Joueurs.Joueur; J2: in Joueurs.Joueur);
   procedure Afficher(Un_Plateau : Plateaux.Plateau);

   procedure Organise_Game(Jeu :in out T_Game);
   Procedure Set_Joueur(Game:in out T_Game;J:joueur;Num:Positive);
   Procedure Set_Grille_Jeu(Game:in out T_Game;Plateau_Jeu:Plateau);
   Procedure Set_Current_Joueur(Game:in out T_Game;Current_Joueur:Joueur);
   Procedure Set_Score_Joueur(Game:in out T_Game;NUm:Positive;Score:Natural);
   Function Get_Joueur(Game:T_Game;Num : Positive) Return Joueurs.Joueur;
   Function Get_Grille_Jeu(Game:T_Game) Return Plateaux.Plateau;
   Function Get_Score(Game : T_Game;Num : Positive) return Natural;
   Function Get_Current_Joueur(Game : T_Game) Return Joueur;
   Function Get_Couleur_Pion(Game : T_Game) return Gdk_Color;
   Procedure Set_Couleur_Pion(Game : in out T_Game;Num : Natural;Couleur: Gdk_Color);
   Function Construct_Game(Joueur1,Joueur2:Joueur;IA_j1,IA_j2:IA_Difficulty;Grille_jeu:Plateau;
                          Couleur1,Couleur2 : Gdk_Color)
                           return T_Game;
   Procedure Jouer_Case(Game  : in out T_Game;Colonne : Plateaux.Colonne;
                        Ligne : Plateaux.Ligne);
   Procedure Tester_Fin(Game : in out T_Game; Resultat:in out Positive) ;

private

    Type T_Game Is Record
      Grille_Jeu : Plateau;
      Joueur1  : Joueur;
      Joueur2  : Joueur;
      IA_Joueur1 : IA_Difficulty;
      IA_Joueur2 : IA_Difficulty;
      Current_Joueur : Joueur;
      Score_joueur1       : Natural;
      Score_Joueur2       : Natural;
      Match_nul           : Natural;
      Couleur_Pion1       : Gdk_Color;
      Couleur_Pion2       : Gdk_Color;
   End Record;

   Not_Joueur : Exception;

end Partie;
